package pt.polynomials.controllers;
/**
* performs the divizion of 2 polynomials
* has the polynomial rest as an attribute
* @author Chiti
*/
import java.util.Iterator;
import pt.polynomials.models.AbstractMonom;
import pt.polynomials.models.DoubleMonom;
import pt.polynomials.models.Polynomial;
public class PolynomialDivide {
public Polynomial<Double> rest = new Polynomial<Double>();
/**
* true if the monom "monom" exists in polynom p
* @param monom
* @param p
* @return
*/
public boolean existsMonom(AbstractMonom<Double> monom, Polynomial<Double> p) {
for (AbstractMonom<Double> m : p.getPolynomial())
if (m.getDegree() == monom.getDegree())
return true;
return false;
}
/**
* gets rid of the terms with 0 coefficient
* @param p
*/
public void cleanPolynomial(Polynomial<Double> p) {
@SuppressWarnings("rawtypes")
Iterator iterator = p.getPolynomial().iterator();
while (iterator.hasNext()) {
DoubleMonom m = (DoubleMonom) iterator.next();
if (m.getCoefficient() == 0)
iterator.remove();
}
}
/**
* substracts double coefficent polynoms
* @param p1
* @param p2
* @return p1-p2
*/
public Polynomial<Double> substract(Polynomial<Double> p1, Polynomial<Double> p2) {
Polynomial<Double> resultI = new Polynomial<Double>();
for (AbstractMonom<Double> m1 : p1.getPolynomial()) {
for (AbstractMonom<Double> m2 : p2.getPolynomial())
if (m1.getDegree() == m2.getDegree()) {
resultI.addMonom(new DoubleMonom(m1.getDegree(), m1.getCoefficient() - m2.getCoefficient()));
break;
}
if (!existsMonom(m1, resultI))
resultI.addMonom(new DoubleMonom(m1.getDegree(), m1.getCoefficient()));
}
for (AbstractMonom<Double> m2 : p2.getPolynomial())
if (!existsMonom(m2, resultI))
resultI.addMonom(new DoubleMonom(m2.getDegree(), -m2.getCoefficient()));
cleanPolynomial(resultI);
resultI.sortPolynomial();
return resultI;
}
/**
* multiplays a polynom with a single monom
* @param p1
* @param monom
* @return p1*monom
*/
public Polynomial<Double> multiplyMonom(Polynomial<Double> p1, DoubleMonom monom) {
Polynomial<Double> resultI = new Polynomial<Double>();
for (AbstractMonom<Double> m1 : p1.getPolynomial()) {
DoubleMonom m = new DoubleMonom(m1.getDegree() + monom.getDegree(),
m1.getCoefficient() * monom.getCoefficient());
resultI.addMonom(m);
}
cleanPolynomial(resultI);
resultI.sortPolynomial();
return resultI;
}
/**
* the divizion of 2 polynomials
* @param p1
* @param p2
* @return p1/p2
*/
public Polynomial<Double> divide(Polynomial<Integer> p1, Polynomial<Integer> p2) {
Polynomial<Double> middle = new Polynomial<Double>();
Polynomial<Double> bottom = new Polynomial<Double>();
Polynomial<Double> divizor = new Polynomial<Double>();
DoubleMonom lastDivizorMonom = new DoubleMonom(0, 1);
DoubleMonom lastMiddleMonom = new DoubleMonom(0, 1);
;
for (AbstractMonom<Integer> m : p1.getPolynomial()) {
middle.addMonom(new DoubleMonom(m.getDegree(), m.getCoefficient()));
}
for (AbstractMonom<Integer> m : p2.getPolynomial()) {
divizor.addMonom(new DoubleMonom(m.getDegree(), m.getCoefficient()));
lastDivizorMonom = new DoubleMonom(m.getDegree(), m.getCoefficient());
}
int n = p1.getDegree() - p2.getDegree();
Polynomial<Double> result = new Polynomial<Double>();
rest= new Polynomial<Double>();
do {
for (AbstractMonom<Double> m : middle.getPolynomial()) {
lastMiddleMonom = (DoubleMonom) m;
}
if (lastMiddleMonom.getDegree() >= lastDivizorMonom.getDegree()) {
DoubleMonom monom = new DoubleMonom(n,
lastMiddleMonom.getCoefficient() / lastDivizorMonom.getCoefficient());
result.addMonom(monom);
bottom = multiplyMonom(divizor, monom);
middle = substract(middle, bottom);
}
n--;
} while (middle.getPolynomial().size()!=0 && n >= 0);
result.sortPolynomial();
rest = middle;
rest.sortPolynomial();
return result;
}
}